package main
//题目
//给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
//你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。

 // 思路
 // 使用快慢指针的方法，降低时间复杂度处理方式；快慢指针是 双指针法 的变式 两者之间可以通用

 //Definition for singly-linked list.
 type ListNode24 struct {
     Val int
     Next *ListNode24
 }

func swapPairs(head *ListNode24) *ListNode24 {
	if head==nil ||head.Next==nil {
		return head
	}
	var addList ListNode24

	addList.Next=head

	before:=&addList

	//before:=addList.Next

	first :=head.Next
	second:=head

	 for first != nil {

	 	before.Next=first
	 	tmp :=first.Next
	 	first.Next=second
	 	second.Next=tmp

		 if first.Next.Next !=nil {
			 first=first.Next.Next.Next
			 second=second.Next
			 before=before.Next.Next
		 }else{
		 	break
		 }
	 }
	return addList.Next
}




func main (){
	var l1 ListNode24
	var l2 ListNode24
	var l3 ListNode24
	var l4 ListNode24
	l1.Next=&l2
	l2.Next=&l3
	l3.Next=&l4
	l1.Val=1
	l2.Val=2
	l3.Val=3
	l4.Val=4
	swapPairs(&l1)
}
